package com.thread;

/**
 * 线程的状态有两种定义
 * 首先是操作系统层面的定义
 * 在操作系统层面，线程状态定义为五种
 * 初始状态 可运行状态 运行状态 阻塞状态 终止状态
 * 【初始状态】: 意味着仅仅是在语言层面创建了线程对象，还未与操作系统线程关联
 * 【可运行状态】：(就绪状态)指该线程已经被创建(已经与操作系统线程相关联！),可以由CPU调度执行
 * 【运行状态】：指获取是CPU时间片后开始运行，运行中的状态
 * -那么要注意一点：当CPU的时间片用完，会从【运行状态】转为【可运行状态】，这样就会导致线程的上下文切换、耗费性能
 * 【阻塞状态】
 * -如果调用了阻塞API，比如BIO读写文件，这时该线程实际不会用到CPU，就会导致上下文切换，进入【阻塞状态】
 * -等BIO操作完毕，会由操作系统唤醒阻塞的线程，转换至【可运行状态】
 * 与【可运行状态】的区别是，对【阻塞状态】的线程来说，只要它们一直不被唤醒，调度器就一直不会考虑调度它们
 * 【终止状态】：表示线程已经执行完毕，生命周期已结束，不会再转换为其它状态。
 * <p>
 * 其次是在Java API层面的定义
 * 在《并发编程的艺术》这本书中，为线程定义了六种状态
 * 分别是： NEW、BOLCED、WAITING、RUNNABLE、TERMINATED、TIMED_WAITING
 * 1、NEW状态：线程刚刚创建，但是还没有调用start()方法
 * 2、RUNNABLE状态：线程已经调用start()方法，但在等待CPU调度。
 * 这里JAVA API层面的RUNNABLE涵盖了操作系统层面的【可运行状态】、【运行状态】、【阻塞状态(由于BIO造成的阻塞，在Java里无法区分，仍然认为是可运行的)】
 * BLOCKED、WAITING、TIMED_WAITING状态都是Java API层面对于操作系统【阻塞状态】的细分
 * 3、BLOCKED状态：线程在等待监视器锁时，陷入阻塞状态
 * 4、WAITING状态：
 * -线程陷入等待，比如说一个线程由于调用某个对象的wait方法陷入WAITING状态，
 * 就需要其他线程调用该对象上的notify或者notifyall方法唤醒在该对象上的线程。
 * -主线程调用t1线程的join方法，不指定时间，那么主线程也会进入Waiting状态，直到t1执行完毕
 * -在某个线程内部调用了SupportLock.park()方法，那么也会使当前线程陷入Waiting状态,直到被其他线程调用unpark()方法唤醒
 * 5、TIMED_WAITING状态：线程在等待某些时间时，比如说一个线程由于调用某个对象的wait方法陷入WAITING状态，
 * 与WAITING状态差不多，只不过指定了时间，而在WAITING状态中说的API，基本也都可以指定时间
 * 6、TERMINATED状态：线程已经执行完毕，生命周期已结束，不会再转换为其它状态。
 */
public class ThreadStatus {
}
